#ifndef __MY_CLOUD__
#define __MY_CLOUD__
#include "data.hpp"
#include "httplib.h"
#include "util.hpp"
#include <Windows.h>
#define SERVER_ADDR "47.108.25.253"
#define SERVER_PORT 9090
namespace cloud
{
		class Backup
		{
		public:
			Backup(const std::string& back_dir, const std::string& back_file)
				:_back_dir(back_dir)
			{
				_data = new DataManager(back_file);
			}
			std::string GetFileIdentifier(std::string filename)
			{
				FileUtil fu(filename);
				std::stringstream ss;
				ss << fu.FileName() << "-" << fu.FileSize() << "-" << fu.LastMTime();
				return ss.str();
			}
			bool Upload(const std::string& filename)
			{
				// 1.获取文件数据
				FileUtil fu(filename);
				std::string body;
				fu.GetContent(&body);

				// 2.搭建http客户端上传文件数据
				httplib::Client client(SERVER_ADDR, SERVER_PORT);
				httplib::MultipartFormData item;
				item.content = body;
				item.filename = fu.FileName();
				item.name = "file";
				item.content_type = "application/octet-stream";
				httplib::MultipartFormDataItems items;
				items.push_back(item);

				auto res = client.Post("/upload", items);
				if (!res || res->status != 200)
				{
					return false;
				}
				return true;
			}
			bool IsNeedUpload(const std::string& filename)
			{
				// 需要上传的文件判断条件：文件是新增的，不是新增的但是被修改过
				// 文件是新增的：看一下有没有备份信息
				// 不是新增的但是被修改过：有历史信息，但是历史信息的唯一标识符与当前最新的唯一标识符不一致
				std::string id;
				if (_data->GetOneByKey(filename, &id) != false)
				{
					// 有历史信息
					std::string new_id = GetFileIdentifier(filename);
					if (new_id == id)
					{
						return false;
					}
				}
				//判断一个文件是否有一段时间没有被修改过了
				FileUtil fu(filename);
				if (time(NULL) - fu.LastMTime() < 3)
				{
					return false;
				}
				return true;
			}
			bool RunMoudle()
			{
				while (1)
				{
					// 1.遍历获取指定文件夹中所有文件
					FileUtil fu(_back_dir);
					std::vector<std::string> array;
					fu.ScanDirectory(&array);
					// 2.逐个判断是否需要上传
					for (auto& a : array)
					{
						if (IsNeedUpload(a) == false)
							continue;
						// 3.如果需要，则上传文件
						if (Upload(a) == true)
						{
							_data->Insert(a, GetFileIdentifier(a));
							std::cout << a << " upload success!" << std::endl;
						}
					}
					Sleep(1);
				}
			}
		private:
			std::string _back_dir;
			DataManager* _data;
		};
}
#endif
